package com.ychs.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.InputStream;

/**
 * copyright(c)2021 YYB.ALL rights Reserved
 * <p>
 * 描述:
 *
 * @author 原玉波
 * @version 1.0
 * @date 2021/5/17
 */
public class DBUtil {
    private Logger logger = Logger.getLogger(DBUtil.class);
    /*
     * 单例对象,饿汉模式
     */
    //private static DBUtil dbUtil = new DBUtil();
    /**
     * 单例对象，懒汉模式
     */
    private static DBUtil dbUtil = new DBUtil();

    private SqlSessionFactory factory;

    //单元测试用
    private SqlSession session;

    //判断是否关闭session的变量
    private static boolean closeFlag = true;

    /**
     * 私有化构造方法是为了单例模式做准备
     */
    private DBUtil(){
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream("mybatis-cfg.xml");
            logger.debug("debug is="+is);
            logger.info("info is="+is);
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (Exception e) {
            logger.error("初始化时出错了",e);
            //e.printStackTrace();
        }
    }

    /**
     * 单例模式对外提供的一个出口，返回自身
     * @return
     */
    public static DBUtil getInstance(){
        //饿汉
        //return dbUtil;
        if(dbUtil==null){
            //此时，需要初始化
            dbUtil = new DBUtil();
        }
        return dbUtil;
    }
    //DBUtil.getInstance().getSqlSession();


    /**
     * 获取session会话，当数据库连接异常时，会返回null对象
     * @return session会话
     */
    public SqlSession getSqlSession(){
        if(factory!=null){
            return factory.openSession();
        }else{
            return null;
        }
        /*//h2单元测试用
        if(session==null){
            session = factory.openSession();
        }
        return session;*/
    }

    public static void close(SqlSession session){
        if(closeFlag){
            session.close();
        }
    }
}
